/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package prog;

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;

/**
 *
 * @author kelyane
 */
public class Bfs {
    
    private Queue<Integer> fila = new ArrayDeque<>();
    private List<Cores> cor = new ArrayList<>();  
    private List<Integer> pi = new ArrayList<>();
    private List<Integer> d = new ArrayList<>();
    private List<Integer> ordVisita = new ArrayList<>();

    public List<Integer> getOrdVisita() {
        return ordVisita;
    }
    private int s;

    public int getS() {
        return s;
    }

    public Queue<Integer> getFila() {
        return fila;
    }

    public List<Cores> getCor() {
        return cor;
    }

    public List<Integer> getPi() {
        return pi;
    }

    public List<Integer> getD() {
        return d;
    }

    public Grafo getGrafo() {
        return grafo;
    }
    
    
    private enum Cores{
        branco, cinza, preto;
    }
    
    private Grafo grafo;
    
    
    public Bfs(Grafo grafo,int s){
        this.grafo = grafo;     
        this.s = s;
    }
            
        
    public void executeBfs(){
        
        for(int i=0; i<grafo.countVertices();i++){
            cor.add(Cores.branco);
            pi.add(-1);                      
            d.add(-1);            
        }
                
        cor.set(s,Cores.cinza);
        d.set(s, 0);
        pi.set(s,-1);
        fila.add(s);
        ordVisita.add(s);
        
        while(!fila.isEmpty()){
            int u = fila.poll();
            
            for(Integer v : grafo.obtemAdj(u)){
                if(cor.get(v) == Cores.branco){                                        
                    cor.set(v,Cores.cinza);
                    d.set(v, d.get(u)+1);
                    pi.set(v,u);
                    fila.add(v);
                    ordVisita.add(v);
                }
                
            }             
            cor.set(u, Cores.preto);
            
        }
        
    }
    
    
    
}
